﻿<?php

// Si la connexion a une des BDD echoue, on renvoie l'admin sur une page lui indiquant que les base de données ne sont pas crées ou injoignables
require_once $_SERVER['rootadmin']."/test_bdd.php";

if(!$db_ok){
	header("Location: ".$_SERVER['admin']."/nobd.php?cmix=".$cmix."&tc=".$tc);
}
else{
require_once $_SERVER['rootadmin']."/classes/ConnectToBD_cmix.class.php";
	
	// Si la connexion a la BDD echoue, alors on affichera pas la page
	$idcon_cmix=ConnectToBd_cmix::connexion();
		$db = false;
	
?>
<!doctype html>
<html>
<head>
<title>
Administration des jeux
</title>
<link rel="stylesheet" href="<?php echo $_SERVER['admin'];?>/css/style.css">
<script language="javascript" src="<?php echo $_SERVER['admin']; ?>/js/XMLHttpRequest.js"></script>
<script language="javascript" src="<?php echo $_SERVER['admin']; ?>/js/makeXhr.js"></script>
<script language="javascript">

/*************************************************

			TRAITEMENT LORS DU CHOIX DU JEU

*************************************************/


// Fonction qui modifie l'interface de la page pour administrer un jeu en particulier
function administrer(jeu){
	id_jeu = jeu;
	getVars(jeu);
	getServeurs(jeu);
};

// On stock l'id du jeu qu' on va administrer.
// La valeur est fixée au moment du clic sur le bouton "Administrer"
var id_jeu;


/*************************************************

				GESTION DES VARIABLES

*************************************************/


// On recupère les variables de configuration du jeu qu'on va administrer
function getVars(jeu){
	getXhr("<?php echo $_SERVER['admin'];?>/admin_plateforme/getVars.php?jeu="+jeu, afficherVariables);
	document.getElementById('error_var').innerHTML ="";
};

// Fonction de callback de getVars, qui affiche le tableau des variables de conf
function afficherVariables(reponse){
	document.getElementsByClassName('tableau')[0].innerHTML = reponse;
};


// Fonction qui affiche la ligne pour ajouter une nouvelle variable
function showNewVar(jeu){
	document.getElementById('new_var').innerHTML = "<td><input type='text' id='new_var_nom'/></td><td><input type='text' id='new_var_value'/></td><td><textarea rows='3' cols='60' id='new_var_desc'></textarea></td><td><input type='button' onClick='setNewVar("+jeu+");' value='Ajouter'/></td>";
};

// Fonction qui envoie les données pour ajouter une nouvelle variable de configuration
function setNewVar(jeu){
	data = "new_var_nom=" + document.getElementById('new_var_nom').value + "&new_var_value=" + document.getElementById('new_var_value').value + "&new_var_desc=" + document.getElementById('new_var_desc').value+"&id_jeu="+jeu;

	postXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/setNewVar.php", data, gererNewVar);
};


// Fonction de callback de setNewVar, qui traite la réponse du script
function gererNewVar(reponse){
	if(reponse == "oui"){
		getVars(id_jeu);
	}
	else{
		document.getElementById('error_var').innerHTML = reponse;
	}
};

// Fonction qui supprime une variable de configuration d'un jeu
function deleteVar(nomVar){
	data= "nom_var="+nomVar;
	postXhr('<?php echo $_SERVER['admin']."/admin_plateforme/deleteVar.php";?>', data, function(){});
	var oldVar = document.getElementById(nomVar);
	oldVar.parentNode.removeChild(oldVar.nextSibling.nextSibling);
	oldVar.parentNode.removeChild(oldVar);
};

// Fonction qui permet d'envoyer les données pour modifier les variables de configuration d'un jeu
function setVars(jeu){
	
	var data = "";
	
	// On recupere toutes les valeurs et les noms des variables
	var noms = document.getElementsByClassName('variable_nom');
	var valeurs = document.getElementsByClassName('variable_valeur');
	var nb_variables = noms.length;

	// On parcourt la liste des variables pour cree la chaine des donnees que l'on va passe en POST
	for(var i = 0 ; i < nb_variables-1 ; i++){
		data = data + noms[i].innerHTML + "=" + valeurs[i].value + "&";
	}
	data = data + noms[nb_variables-1].innerHTML + "=" + valeurs[nb_variables-1].value;
	
	postXhr("<?php echo $_SERVER['admin'];?>/admin_plateforme/setVars.php", data, function(){});
};

/*************************************************

				GESTION DES SERVEURS

*************************************************/

// Fonction qui récupère la liste des serveurs
function getServeurs(jeu){
	getXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/getServeurs.php?id_jeu="+jeu, afficherServeurs);
	document.getElementById('error_serv').innerHTML = "";
};

// Fonction qui affiche la liste des serveurs
function afficherServeurs(reponse){
	document.getElementById('serveurs').innerHTML = reponse;
	
	var urls = document.getElementsByClassName('url_serveur');
	var noms = document.getElementsByClassName('nom_serveur');

	for(var i = 0 ; i < urls.length ; i++){
		getOnline(urls[i].innerHTML+"/ping.php",noms[i].innerHTML);
		var tmp_fct = "getOnline('"+urls[i].innerHTML+"/ping.php','"+noms[i].innerHTML+"')";
		setInterval(tmp_fct,5000);
	}
};




// Fonction permettant de créer un objet ping
function ping(){
	this.nbPing = 0;
};

// Fonction qui vérifie si le serveur est en ligne
// On effectue nbMax requêtes et suivant le résultat le traitement est différent:
// - On a reçu une réponse pour chaque requête -> lumière verte et tout est ok
// - On a reçu aucune réponse -> lumière rouge (serveur down)
// - On a reçu que quelques réponses -> warning, il y a surement un problème sur le serveur ou le réseau
function getOnline(serveur, nom_serveur){
	
	var pingu = new ping();
	
	var nbMax = 5;
	
	var i = nbMax;
	
	while(i>0){
		pingu.nbPing++;
		getXhrTimeout(serveur, nom_serveur, pingu);
		i--;
	}
	
	
	setTimeout(function(){
	if(pingu.nbPing == 0){
		document.getElementById("online_"+nom_serveur).style.display = "block";
		document.getElementById("offline_"+nom_serveur).style.display = "none";
		document.getElementById("warning_"+nom_serveur).style.display = "none";
	}
	else if (pingu.nbPing == nbMax){
		document.getElementById("online_"+nom_serveur).style.display = "none";
		document.getElementById("offline_"+nom_serveur).style.display = "block";
		document.getElementById("warning_"+nom_serveur).style.display = "none";
	}
	else{
		document.getElementById("online_"+nom_serveur).style.display = "none";
		document.getElementById("offline_"+nom_serveur).style.display = "none";
		document.getElementById("warning_"+nom_serveur).style.display = "block";
		
	}
		},2000);
};

// Fonction qui envoie les données pour ajouter un nouveau serveur de jeu
function setNewServ(jeu){
	data = "new_serv_nom=" + document.getElementById('new_serv_nom').value + "&new_serv_url=" + document.getElementById('new_serv_url').value + "&new_serv_bdd=" + document.getElementById('new_serv_bdd').value+"&id_jeu="+id_jeu+"&new_serv_langue="+document.getElementById('langue').value;

	postXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/setNewServ.php", data, gererNewServ);
};

// Fonction de callback de setNewServ, qui traite la réponse du script
function gererNewServ(reponse){
	if(reponse == "oui"){
		getServeurs(id_jeu);
	}
	else{
		document.getElementById('error_serv').innerHTML = reponse;
	}
};

// Fonction qui affiche la ligne pour ajouter un nouveau serveur de jeu
function showNewServ(){
	var nom = "<td><input type='text' id='new_serv_nom'/></td>";
	var url = "<td><input type='text' id='new_serv_url'/></td>";
	var bdd = "<td><input type='text' id='new_serv_bdd'/></td>";
	var langue = "<td><select id='langue'><option value='0'>Langue</option><option value='fr'>Français</option><option value='eng'>Anglais</option></select></td>";
	document.getElementById('new_serv').innerHTML = "<td></td>"+nom+url+bdd+langue+"<td colspan='1'><input type='button' onClick='setNewServ();' value='Ajouter'/></td><td colspan='2' ><input type='button' onClick='hideNewServ();' value='Annuler'/></td>";
};

// Fonction qui cache la ligne pour ajouter un nouveau serveur
function hideNewServ(){
	document.getElementById('new_serv').innerHTML = "<th colspan='7'><input type='button' onClick='showNewServ();' value='Ajouter un serveur'/></th</tr><tr><th colspan='7'></th>"
	document.getElementById('error_serv').innerHTML = "";
};

// Fonction qui supprime un serveur de jeu ainsi que toutes les salles presentes sur ce serveur
function deleteServ(nomServ, id_serveur){
	data= "id_serveur="+id_serveur;
	postXhr('<?php echo $_SERVER['admin']."/admin_plateforme/deleteServ.php";?>', data, function(){});
	var oldServ = document.getElementById(nomServ);
	oldServ.parentNode.removeChild(oldServ.nextSibling.nextSibling);
	oldServ.parentNode.removeChild(oldServ);
};

/*************************************************

				GESTION DES SALLES

*************************************************/

// Fonction qui recupere les salles d'un serveur de jeu
function getSalles(serveur, nom_serveur){
	getXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/getSalles.php?id_serveur="+serveur+"&nom_serveur="+nom_serveur, function(reponse){afficherSalles(reponse, nom_serveur);});
	document.getElementById('error_salles').innerHTML = "";
};

// Fonction qui affiche les salles d'un serveur de jeu
// Elle gere aussi l'affichage des boutons "afficher salles" et "cacher salles"
function afficherSalles(reponse, nom_serveur){
	var listes_salles = document.getElementsByClassName('liste_salles');
	var show_salles = document.getElementsByClassName('show_salles');
	var hide_salles = document.getElementsByClassName('hide_salles');
	
	for(var i = 0 ; i < listes_salles.length ; i++){
		listes_salles[i].innerHTML = "";
		show_salles[i].style.display = "block";
		hide_salles[i].style.display = "none";
	}
	document.getElementById('liste_salles_'+nom_serveur).innerHTML = reponse;
	document.getElementById('show_salles_'+nom_serveur).style.display = "none";
	document.getElementById('hide_salles_'+nom_serveur).style.display = "block";
};

// Fonction qui cache les salles d'un serveur de jeu
function hideSalles(nom_serveur){
	document.getElementById('liste_salles_'+nom_serveur).innerHTML = "";
	document.getElementById('show_salles_'+nom_serveur).style.display = "block";
	document.getElementById('hide_salles_'+nom_serveur).style.display = "none";
};

// Fonction qui affiche la barre pour ajouter une nouvelle salle
function showNewSalle(nom_serveur, id_serveur){
	var nom_salle = "<td><input type='text' id='nom_salle'/></td>";
	var ajouter = "<td ><input type='button' onClick=\"addSalle('"+nom_serveur+"','"+id_serveur+"');\" value='Ajouter'/></td>" ;
	var annuler = "<td><input type='button' onClick=\"hideNewSalle();\" Value='Annuler'/></td>";
	document.getElementById('new_salle').innerHTML = nom_salle+ajouter+annuler;
};

// Fonction qui cache la barre pour ajouter une nouvelle salle
function hideNewSalle(nom_serveur, id_serveur){
	document.getElementById('new_salle').innerHTML = "<tr class='new_line' id='new_salle'><th colspan='3'><input type='button' onClick=\"showNewSalle('"+nom_serveur+"','"+id_serveur+"');\" value='Ajouter une salle' /></th></tr>";
	document.getElementById('error_salle').innerHTML = "";
};

// Fonction qui ajoute une salle
function addSalle(nom_serveur, id_serveur){
	var data = "new_salle_nom="+document.getElementById('nom_salle').value+"&id_serveur="+id_serveur;
	postXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/setNewSalle.php", data, function(reponse){gererNewSalle(reponse, nom_serveur, id_serveur);});
};

// Fonction de callback de addSalle
// Actualise le nombre de salles du serveur en incrementant sa valeur directement si la reponse est positive
// Pour eviter une nouvelle requete BDD
function gererNewSalle(reponse, nom_serveur, id_serveur){
	if(reponse == "oui"){
		getSalles(id_serveur, nom_serveur);
		document.getElementById('nb_salles_'+nom_serveur).innerHTML = Number(document.getElementById('nb_salles_'+nom_serveur).innerHTML) + 1;
	}
	else{
		document.getElementById('error_salle').innerHTML = reponse;
	}
};

// Fonction qui supprimer une salle sur un serveur de jeu
function deleteSalle(id_salle, id_serveur, nom_serveur){
	data= "id_salle="+id_salle+"&id_serveur="+id_serveur;
	postXhr('<?php echo $_SERVER['admin']."/admin_plateforme/deleteSalle.php";?>', data, function(){		document.getElementById('nb_salles_'+nom_serveur).innerHTML = Number(document.getElementById('nb_salles_'+nom_serveur).innerHTML) - 1;
});
	
	var oldSalle = document.getElementById(id_salle);
	oldSalle.parentNode.removeChild(oldSalle.nextSibling.nextSibling);
	oldSalle.parentNode.removeChild(oldSalle);
};

/******************************************

				GESTION DES JEUX

******************************************/

function showNewJeu(){
	var nomJeu = "<td><input id='nomJeu' type='text' id='newJeu'/></td>";
	var descJeu = "<td><textarea id='descJeu' rows='3' cols='40'></textarea></td>";
	var rootJeu = "<td><input type='text' id='rootJeu'/></td>";
	var boutonAjoutJeu = "<td><input type='button' onClick='setNewJeu();' value='Ajouter jeu'/></td>";
	var boutonAnnulerJeu = "<td colspan='2'><input type='button' onClick='hideNewJeu();' value='Annuler'/></td>";
	document.getElementById('newJeu').innerHTML = nomJeu+descJeu+rootJeu+boutonAjoutJeu+boutonAnnulerJeu;
};

function hideNewJeu(){
	document.getElementById('newJeu').innerHTML = "<th colspan='6'><input type='button' onClick='showNewJeu();' value='Ajouter un jeu'/></th>";
};

function setNewJeu(){
	var data = "new_jeu_nom="+document.getElementById('nomJeu').value;
	data = data+"&new_jeu_desc="+document.getElementById('descJeu').value;
	data = data+"&new_jeu_root="+document.getElementById('rootJeu').value;
	postXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/setNewJeu.php", data, gererNewJeu);
};

function gererNewJeu(reponse){
	if(reponse == "oui"){
		document.location = 'index.php';
	}
	else{
		document.getElementById('error_jeu').innerHTML = reponse;
	}
};

function confirmDeleteJeu(jeu, id_jeu){
	if(confirm("Supprimer le jeu: "+jeu+" ?")){
		deleteJeu(id_jeu);
	}
};

function deleteJeu(id_jeu){
	var data= "id_jeu="+id_jeu;
	postXhr("<?php echo $_SERVER['admin'];?>/admin_jeux/deleteJeu.php", data, gererDeleteJeu);
};

function gererDeleteJeu(reponse){
	if(reponse == "oui"){
		document.location = 'index.php';
	}
	else{
		document.getElementById('error_serv').innerHTML = "Erreur de base de données.<br/>";
	}
};

</script>
</head>
<body>
	<?php include $_SERVER['rootadmin']."/bandeau.php";?>
	<h1>Administration des jeux</h1>
	<div class="tableau">
	<table>
	<tr>
	<th>Jeu</th>
	<th>Description</th>
	<th>Racine du jeu</th>
	<th>Nombre de serveurs</th>
	<th colspan="2"></th>
	</tr>
	<?php
		$req="SELECT id_jeu, nom_jeu, root_jeu, description FROM jeux;";
		$jeux=$idcon_cmix->prepare($req);
		$jeux->execute();
		if($jeux->rowcount() != 0){
			while($jeu = $jeux->fetch()){
				echo "<tr><td>".$jeu['nom_jeu']."</td><td>".$jeu['description']."</td><td>".$jeu['root_jeu']."</td>";	
				$req="SELECT count('id_serveur') FROM serveur WHERE id_jeu='".$jeu['id_jeu']."';";
				$nbserv=$idcon_cmix->prepare($req);
				$nbserv->execute();
				if($nbserv->rowcount() == 0){
					echo "<td>0</td>";
				}
				else{
					$nbserv = $nbserv->fetch();
					echo "<td>".$nbserv["count('id_serveur')"]."</td>";
				}			
				echo "<td><input type='button' value='Administrer' onClick=\"administrer('".$jeu['id_jeu']."');\" /></td>";
				echo "<td><input type='button' value='Supprimer' onClick=\"confirmDeleteJeu('".$jeu['nom_jeu']."','".$jeu['id_jeu']."');\" /></td></tr>";
				echo "<tr><th colspan='6'></th></tr>";
			}
		}	
	?>
	<tr class="new_line" id="newJeu"><th colspan="6"><input type="button" onClick="showNewJeu();" value="Ajouter un jeu"/></th></tr>
	<tr><th colspan="6"></th></tr>
	</table>
	<div class="error" id="error_jeu"></div>
	</div>
	<div class="error" id="error_var"></div>
	<div id="serveurs">
	</div>
	<div class="error" id="error_serv"></div>
	<div id="salles">
	</div>
	<div class="error" id="error_salles">
	</div>
</body>
</html>
<?php } ?>